Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat/add_exchange_messages_from_v1_13 #232

Merged
merged 2 commits into from
Aug 6, 2024

Conversation

aarmoa
Copy link
Collaborator

@aarmoa aarmoa commented Aug 6, 2024

  • Added support for the new messages in exchange module, included in the chain upgrade v1.13.
  • Added unit tests and example scripts
  • Added the min_notional field to all market classes.
  • Added logic to initialize the min_notional as part of the markets and tokens initialization in AsyncClient

Solves CHAIN-171

Summary by CodeRabbit

  • New Features

    • Introduced a min_notional parameter across various market configurations to enforce minimum trade sizes, enhancing liquidity management.
    • Added functionality to update spot and derivative market parameters, including a minimum notional value for trading.
    • New command-line applications for adjusting market margins and authorizing stake grants, improving user interaction with the blockchain.
  • Bug Fixes

    • Updated the Codecov action version in the CI/CD workflow to enhance coverage reporting capabilities.
  • Documentation

    • Added examples for interacting with the blockchain for decreasing position margins and updating market parameters.

…d in the chain upgrade v1.13. Added unit tests and example scripts
Copy link

coderabbitai bot commented Aug 6, 2024

Walkthrough

The recent updates enhance the trading functionalities by introducing a new minNotional parameter across multiple components, including market structures and configuration files. This addition allows for better liquidity management by enforcing minimum trade sizes in both spot and derivative markets. Additionally, the changes to the GitHub Actions workflow for Codecov improve CI/CD processes by upgrading to a newer version, ensuring better coverage reporting in the development cycle.

Changes

File Path Change Summary
.github/workflows/run-tests.yml Updated Codecov action from v3 to v4 for improved coverage reporting in CI/CD workflows.
client/chain/markets_assistant.go Added minNotional parameter to market initialization functions and structures, enhancing market configurations.
client/chain/markets_assistant_test_support.go Modified market info creation functions to include MinNotional set to "1000000" for spot and derivative markets.
client/core/market.go Introduced MinNotional field and conversion methods for SpotMarket and DerivativeMarket.
client/core/market_test.go Updated tests to validate conversions involving the new MinNotional parameter.
client/metadata/assets/devnet-1.ini Added min_notional parameter to asset definitions with varying values, setting minimum trade requirements.
client/metadata/assets/devnet.ini Similar updates as devnet-1.ini, adding min_notional for various trading pairs.
client/metadata/assets/testnet.ini Introduced min_notional = 0 for trading pairs and added new peggy_denom entries with corresponding decimals.
examples/chain/exchange/23_MsgDecreasePositionMargin/example.go New application for decreasing margin in a trading position.
examples/chain/exchange/24_MsgUpdateSpotMarket/example.go New application for updating a spot market's configuration.
examples/chain/exchange/25_MsgUpdateDerivativeMarket/example.go New application for updating derivative market parameters.
examples/chain/exchange/26_MsgAuthorizeStakeGrants/example.go New application for authorizing stake grants on the blockchain.
examples/chain/exchange/27_MsgActivateStakeGrant/example.go New application for activating stake grants.
examples/chain/exchange/3_MsgInstantSpotMarketLaunch/example.go Added MinNotional to MsgInstantSpotMarketLaunch for enforcing minimum notional during market launches.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Application
    participant Blockchain

    User->>Application: Initiate market update
    Application->>Blockchain: Load configuration
    Blockchain-->>Application: Configuration loaded
    Application->>Blockchain: Construct MsgUpdateSpotMarket
    Application->>Blockchain: Broadcast update
    Blockchain-->>Application: Confirmation of update
    Application-->>User: Display success message
Loading

🐰 "In the fields where rabbits play,
New notional rules come into sway.
From markets bright to trades so fair,
Our hops and bounds are filled with care.
With every change, we leap with glee,
In trading's dance, we’re wild and free!" 🐇✨


Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 907ab57 and 0b4fbfd.

Files selected for processing (14)
  • .github/workflows/run-tests.yml (1 hunks)
  • client/chain/markets_assistant.go (7 hunks)
  • client/chain/markets_assistant_test_support.go (3 hunks)
  • client/core/market.go (9 hunks)
  • client/core/market_test.go (10 hunks)
  • client/metadata/assets/devnet-1.ini (33 hunks)
  • client/metadata/assets/devnet.ini (33 hunks)
  • client/metadata/assets/testnet.ini (62 hunks)
  • examples/chain/exchange/23_MsgDecreasePositionMargin/example.go (1 hunks)
  • examples/chain/exchange/24_MsgUpdateSpotMarket/example.go (1 hunks)
  • examples/chain/exchange/25_MsgUpdateDerivativeMarket/example.go (1 hunks)
  • examples/chain/exchange/26_MsgAuthorizeStakeGrants/example.go (1 hunks)
  • examples/chain/exchange/27_MsgActivateStakeGrant/example.go (1 hunks)
  • examples/chain/exchange/3_MsgInstantSpotMarketLaunch/example.go (2 hunks)
Files skipped from review due to trivial changes (1)
  • .github/workflows/run-tests.yml
Additional comments not posted (105)
examples/chain/exchange/27_MsgActivateStakeGrant/example.go (4)

1-15: LGTM!

The package declaration and imports are appropriate for the functionality provided.


17-36: LGTM!

The network, Tendermint client, and Cosmos keyring initialization are correct and handle errors appropriately.


38-46: LGTM!

The client context initialization is correct and handles errors appropriately.


50-58: LGTM!

The chain client initialization is correct and handles errors appropriately.

examples/chain/exchange/26_MsgAuthorizeStakeGrants/example.go (4)

1-17: LGTM!

The package declaration and imports are appropriate for the functionality provided.


19-38: LGTM!

The network, Tendermint client, and Cosmos keyring initialization are correct and handle errors appropriately.


40-48: LGTM!

The client context initialization is correct and handles errors appropriately.


50-58: LGTM!

The chain client initialization is correct and handles errors appropriately.

examples/chain/exchange/23_MsgDecreasePositionMargin/example.go (4)

1-17: LGTM!

The package declaration and imports are appropriate for the functionality provided.


19-38: LGTM!

The network, Tendermint client, and Cosmos keyring initialization are correct and handle errors appropriately.


40-48: LGTM!

The client context initialization is correct and handles errors appropriately.


50-58: LGTM!

The chain client initialization is correct and handles errors appropriately.

examples/chain/exchange/3_MsgInstantSpotMarketLaunch/example.go (3)

77-77: Initialization of minNotional looks good.

The minNotional variable is correctly initialized using math.LegacyMustNewDecFromStr("1").


83-83: Computation of chainMinNotional looks good.

The chainMinNotional variable is correctly computed by multiplying minNotional with the decimal representation of the quoteToken's decimals.


92-92: Addition of MinNotional to the MsgInstantSpotMarketLaunch struct looks good.

The MinNotional field is correctly added to the MsgInstantSpotMarketLaunch struct.

examples/chain/exchange/25_MsgUpdateDerivativeMarket/example.go (1)

1-102: New example file for updating a derivative market looks good.

The file correctly initializes minNotional and uses it in the MsgUpdateDerivativeMarket struct. The overall structure and logic are consistent with other examples.

examples/chain/exchange/24_MsgUpdateSpotMarket/example.go (1)

1-104: New example file for updating a spot market looks good.

The file correctly initializes minNotional and uses it in the MsgUpdateSpotMarket struct. The overall structure and logic are consistent with other examples.

client/chain/markets_assistant_test_support.go (3)

91-91: LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field with a value of "1000000" looks good. Ensure that this change is consistent across the codebase and aligns with the intended functionality.

Verification successful

Verified: Consistent usage of MinNotional field across the codebase.

The MinNotional field is used consistently across various files and contexts, including protobuf definitions, Go structs, and functions. No discrepancies or inconsistencies were found in its usage.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consistency of `MinNotional` usage across the codebase.

# Test: Search for the `MinNotional` field usage. Expect: Consistent usage of the `MinNotional` field.
rg --type go 'MinNotional'

Length of output: 17899


69-69: LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field with a value of "1000000" looks good. Ensure that this change is consistent across the codebase and aligns with the intended functionality.

Verification successful

Verified: Consistent usage of MinNotional field.

The addition of the MinNotional field with a value of "1000000" in client/chain/markets_assistant_test_support.go is consistent with its usage across the codebase. The field is used appropriately in various market-related contexts.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consistency of `MinNotional` usage across the codebase.

# Test: Search for the `MinNotional` field usage. Expect: Consistent usage of the `MinNotional` field.
rg --type go 'MinNotional'

Length of output: 17899


133-133: LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field with a value of "1000000" looks good. Ensure that this change is consistent across the codebase and aligns with the intended functionality.

Verification successful

LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field with a value of "1000000" looks good. The usage of MinNotional is consistent across the codebase and aligns with the intended functionality.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consistency of `MinNotional` usage across the codebase.

# Test: Search for the `MinNotional` field usage. Expect: Consistent usage of the `MinNotional` field.
rg --type go 'MinNotional'

Length of output: 17899

client/core/market.go (9)

42-48: LGTM!

The implementation of the NotionalToChainFormat function for SpotMarket looks correct and aligns with the intended functionality.


59-62: LGTM!

The implementation of the NotionalFromChainFormat function for SpotMarket looks correct and aligns with the intended functionality.


72-74: LGTM!

The implementation of the NotionalFromExtendedChainFormat function for SpotMarket looks correct and aligns with the intended functionality.


129-135: LGTM!

The implementation of the NotionalToChainFormat function for DerivativeMarket looks correct and aligns with the intended functionality.


147-148: LGTM!

The refactoring of the MarginFromChainFormat function for DerivativeMarket to use the NotionalFromChainFormat method looks correct and aligns with the intended functionality.


150-152: LGTM!

The implementation of the NotionalFromChainFormat function for DerivativeMarket looks correct and aligns with the intended functionality.


167-169: LGTM!

The implementation of the NotionalFromExtendedChainFormat function for DerivativeMarket looks correct and aligns with the intended functionality.


22-22: LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field to the SpotMarket struct looks good. Ensure that this change is consistent across the codebase and aligns with the intended functionality.

Verification successful

LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field to the SpotMarket struct looks good. Ensure that this change is consistent across the codebase and aligns with the intended functionality.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consistency of `MinNotional` usage across the codebase.

# Test: Search for the `MinNotional` field usage. Expect: Consistent usage of the `MinNotional` field.
rg --type go 'MinNotional'

Length of output: 17899


92-92: LGTM! Verify consistency of MinNotional usage.

The addition of the MinNotional field to the DerivativeMarket struct looks good. Ensure that this change is consistent across the codebase and aligns with the intended functionality.

client/chain/markets_assistant.go (2)

76-79: LGTM!

The implementation of the minNotional field handling in the NewMarketsAssistant function looks correct and aligns with the intended functionality.

Also applies to: 104-104, 125-125


199-199: LGTM!

The implementation of the minNotional field handling in the NewMarketsAssistantInitializedFromChain function looks correct and aligns with the intended functionality.

Also applies to: 212-212, 243-243, 261-261

client/core/market_test.go (4)

21-21: LGTM!

The MinNotional field has been correctly initialized in the SpotMarket structure.

Also applies to: 34-34


49-49: LGTM!

The MinNotional field has been correctly initialized in the DerivativeMarket structure.

Also applies to: 67-67


99-109: LGTM!

The test functions correctly validate the conversion of notional values to and from chain format for SpotMarket.

Also applies to: 132-141


229-239: LGTM!

The test functions correctly validate the conversion of notional values to and from chain format for DerivativeMarket.

Also applies to: 273-282

client/metadata/assets/devnet-1.ini (19)

9-9: Verify the min_notional value.

The min_notional value is set to 0. Verify if this is the expected value.


19-19: LGTM!

The min_notional value is appropriately set to 1000000.


29-29: LGTM!

The min_notional value is appropriately set to 1000000.


39-39: LGTM!

The min_notional value is appropriately set to 1000000.


49-49: LGTM!

The min_notional value is appropriately set to 1000000.


59-59: LGTM!

The min_notional value is appropriately set to 1000000.


69-69: LGTM!

The min_notional value is appropriately set to 1000000.


79-79: LGTM!

The min_notional value is appropriately set to 1000000.


89-89: LGTM!

The min_notional value is appropriately set to 1000000.


99-99: LGTM!

The min_notional value is appropriately set to 1000000.


109-109: LGTM!

The min_notional value is appropriately set to 1000000.


119-119: LGTM!

The min_notional value is appropriately set to 1000000.


129-129: LGTM!

The min_notional value is appropriately set to 1000000.


139-139: LGTM!

The min_notional value is appropriately set to 1000000.


149-149: LGTM!

The min_notional value is appropriately set to 1000000.


159-159: LGTM!

The min_notional value is appropriately set to 1000000.


169-169: LGTM!

The min_notional value is appropriately set to 1000000.


179-179: LGTM!

The min_notional value is appropriately set to 10000000000000000.


189-189: LGTM!

The min_notional value is appropriately set to 10000000000000000.

client/metadata/assets/devnet.ini (20)

9-9: Verify the correctness of min_notional value.

The min_notional value is set to 0. Ensure this is intentional and correct for the given trading pair.


19-19: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


29-29: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


39-39: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


49-49: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


59-59: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


69-69: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


79-79: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


89-89: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


99-99: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


109-109: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


119-119: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


129-129: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


139-139: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


149-149: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


159-159: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


169-169: LGTM!

The min_notional value is set to 1000000, which seems appropriate.


179-179: Verify the correctness of min_notional value.

The min_notional value is set to 10000000000000000, which is significantly higher than other entries. Ensure this is intentional and correct for the given trading pair.


189-189: Verify the correctness of min_notional value.

The min_notional value is set to 10000000000000000, which is significantly higher than other entries. Ensure this is intentional and correct for the given trading pair.


199-199: Verify the correctness of min_notional value.

The min_notional value is set to 10000000000000000, which is significantly higher than other entries. Ensure this is intentional and correct for the given trading pair.

client/metadata/assets/testnet.ini (31)

9-9: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


19-19: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


29-29: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


39-39: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


49-49: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


59-59: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


69-69: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


79-79: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


89-89: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


99-99: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


109-109: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


119-119: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


129-129: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


139-139: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


149-149: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


159-159: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


169-169: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


179-179: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


189-189: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


199-199: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


209-209: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


219-219: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


229-229: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


239-239: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


249-249: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


259-259: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


269-269: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


279-279: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


289-289: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


299-299: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.


309-309: LGTM!

The addition of min_notional = 0 is consistent with the PR objectives.

Comment on lines +60 to +74
msg := &exchangetypes.MsgActivateStakeGrant{
Sender: senderAddress.String(),
Granter: "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r",
}

// AsyncBroadcastMsg, SyncBroadcastMsg, QueueBroadcastMsg
response, err := chainClient.AsyncBroadcastMsg(msg)

if err != nil {
panic(err)
}

str, _ := json.MarshalIndent(response, "", " ")
fmt.Print(string(str))
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve error handling in message broadcasting.

Instead of using panic, consider logging the error to provide more context and avoid crashing the application.

	if err != nil {
		fmt.Fprintf(os.Stderr, "Error broadcasting message: %v\n", err)
		return
	}

Comment on lines +62 to +80
grantAuthorization := &exchangetypes.GrantAuthorization{
Grantee: "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r",
Amount: math.NewIntWithDecimal(1, 18),
}

msg := &exchangetypes.MsgAuthorizeStakeGrants{
Sender: senderAddress.String(),
Grants: []*exchangetypes.GrantAuthorization{grantAuthorization},
}

// AsyncBroadcastMsg, SyncBroadcastMsg, QueueBroadcastMsg
response, err := chainClient.AsyncBroadcastMsg(msg)

if err != nil {
panic(err)
}

str, _ := json.MarshalIndent(response, "", " ")
fmt.Print(string(str))
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve error handling in message broadcasting.

Instead of using panic, consider logging the error to provide more context and avoid crashing the application.

	if err != nil {
		fmt.Fprintf(os.Stderr, "Error broadcasting message: %v\n", err)
		return
	}

Comment on lines +62 to +80
defaultSubaccountID := chainClient.DefaultSubaccount(senderAddress)

msg := &exchangetypes.MsgDecreasePositionMargin{
Sender: senderAddress.String(),
MarketId: "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6",
SourceSubaccountId: defaultSubaccountID.String(),
DestinationSubaccountId: defaultSubaccountID.String(),
Amount: math.LegacyMustNewDecFromStr("100000000"), //100 USDT
}

// AsyncBroadcastMsg, SyncBroadcastMsg, QueueBroadcastMsg
response, err := chainClient.AsyncBroadcastMsg(msg)

if err != nil {
panic(err)
}

str, _ := json.MarshalIndent(response, "", " ")
fmt.Print(string(str))
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve error handling in message broadcasting.

Instead of using panic, consider logging the error to provide more context and avoid crashing the application.

	if err != nil {
		fmt.Fprintf(os.Stderr, "Error broadcasting message: %v\n", err)
		return
	}

@aarmoa aarmoa merged commit b7a68cc into master Aug 6, 2024
4 checks passed
@aarmoa aarmoa deleted the feat/add_exchange_messages_from_v1_13 branch August 6, 2024 18:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant